package roteador;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Gerenciador {

    private Map<Integer, Roteador> roteadores;

    public Gerenciador() {
        roteadores = new HashMap<Integer, Roteador>();
        atualizaRoteadores(new File("roteadores.config"));
        //atualizaRoteadores(new File("config\\roteadores.config"));
        atualizaEnlaces(new File("enlaces.config"));
        //atualizaEnlaces(new File("config\\enlaces.config"));
    }

    public void addRoteador(int id, int porta) throws SocketException {
        roteadores.put(id, new Roteador(id, porta));
    }

    public void atualizaRoteadores(File file) {
        BufferedReader in;
        try {
            in = new BufferedReader(new FileReader(file));
            boolean fimDeArquivo = false;
            while (!fimDeArquivo) {
                try {
                    StringTokenizer st = new StringTokenizer(in.readLine(), " ");
                    int id = Integer.parseInt(st.nextToken());
                    int porta = Integer.parseInt(st.nextToken());
                    this.addRoteador(id, porta);
                    System.out.println("id: " + id + " port: " + porta);
                } catch (Exception end) {
                    fimDeArquivo = true;
                }
            }
            in.close();
        } catch (IOException e) {
            System.out.println("Erro no arquivo " + file.getName());
        }
    }

    public void atualizaEnlaces(File file) {
        BufferedReader in;
        try {
            in = new BufferedReader(new FileReader(file));
            boolean fimDeArquivo = false;
            int i = 1;
            while (!fimDeArquivo) {
                try {

                    StringTokenizer st = new StringTokenizer(in.readLine(), " ");
                    int origem = Integer.parseInt(st.nextToken());
                    int destino = Integer.parseInt(st.nextToken());
                    System.out.println("criou o enlace " + i + " de " + origem
                            + " para " + destino);
                    i++;
                    int peso = Integer.parseInt(st.nextToken());
                    this.addEnlace(origem, destino, peso);
                    this.addEnlace(destino, origem, peso);
                } catch (Exception end) {
                    fimDeArquivo = true;
                }
            }
            in.close();
        } catch (IOException e) {
            System.out.println("Erro no arquivo " + file.getName());
        }
    }

    private void addEnlace(int orig, int dest, int peso) {
        Roteador origem = roteadores.get(orig);
        Roteador destino = roteadores.get(dest);
        origem.addEnlace(destino, peso);
    }

    public void removerRoteador(int id) {

        Roteador rote = roteadores.remove(id);
        rote.cancelar();
        System.out.println("Removeu o roteador: " + id);
    }

    public void mudarCustoEnlace(int origem, int destino, int custo) {
        Roteador rote1 = roteadores.get(origem);
        Roteador rote2 = roteadores.get(destino);
        rote1.setPesoEnlace(origem, destino, custo);
        rote2.setPesoEnlace(destino, origem, custo);
    }
}
